/*===============================================
 *   文件名称：main.c
 *   创 建 者: 麦穗飘飘
 *   创建日期：2024年12月14日   10:25:23
 *   描    述：主函数入口
 ================================================*/
#include "port.h" 			// 串口通信驱动
#include "ultrasonic.h" 	// 超声波传感器驱动
#include "sg90.h"			// 舵机驱动

/* 读取STM32串口数据（温度、湿度、烟雾和超声波检测数据）*/ 
extern struct get_information datas; 

/* 超声波测距 */
extern float Hcsr04GetLength; 

int flag = 1; // 超声波测距标志位

/* 接收STM32发送过来的数据线程函数 */
void *recvdata_function(){
    printf("recvdata\n");
    get_bufs(); // 获取来自STM32通过串口发过来的数据
}

/* 接收图像线程函数 */
void *recvimage_function(){ 
    int fd;
    int cfd;
    cfd = sever_to_client(8884, &fd);	// 从Qt那边连接到 A9Board
    char buf[1024];
    memset(buf, 0, sizeof(buf));

    while(1){
        int read_buf=recv(cfd,buf,sizeof(buf),0); //接收客户端发来的数据
        if(read_buf<0) //错误
        { 
            perror("recv");
            printf("here\n");
            close(cfd);
        }
        if(buf[0]=='A' && buf[read_buf-1]=='B'){
            printf("Qt-->Board_buf = %s\n", buf);
            send_signal(buf); // 接收到Qt传输过来的剩余车位和收费信息传给STM32，并在OLED屏幕上进行显示
        }
        else{
            printf("error\n");
        }
    }
    sleep(5);
    close(fd);
    close(cfd);
}

/* 发送图像线程函数 */
int main(){
    pthread_t recvdata,recvimage; //capture;
    int ret;
    ret = pthread_create(&recvimage, NULL, recvimage_function, NULL); // 创建接收图像线程
    if (ret != 0) {
        // 创建线程失败
        perror("smoke_create error:");
        return 1;
    }

    ret = pthread_create(&recvdata, NULL,recvdata_function, NULL);	// 创建接收数据线程
    if (ret != 0) {
        // 创建线程失败
        perror("humidity_create error:");
        return 1;
    }

    int fd;
    int cfd;
    int fd1;
    int cfd1;

    cfd1 = sever_to_client(8886, &fd1);	// 连接到Qt
    printf("connect to A9Board\n");

    cfd = sever_to_client(8888, &fd);	// 连接到PC
    printf("connect to PC cfd = %d\n", cfd);

    char buf[1024];
    memset(buf, 0, sizeof(buf));	// 清空buf
    
    while(1){
        int read_buf=recv(cfd,buf,sizeof(buf),0); //接收客户端A9Board发来的数据
        if(read_buf<0)	//错误
        {
            perror("recv");
            printf("here\n");
            close(cfd);
        }

        if(strcmp(buf, "get_data") == 0){	// 接收到get_data命令
            printf("buf = %s\n", buf);
            break;
        }
        else{
            printf("error\n");
        }
    }
    int flag = 0;	// 超声波测距标志位
    int photo_flag = 1;	// 照片标志位
    while(1){
        printf("start\n");
        if(flag == 0){
            send(cfd, datas.temperature, 1024, 0);
        }
        else if(flag == 1){
            send(cfd, datas.humidity, 1024, 0);
        }
        else if(flag == 2){
            send(cfd, datas.MQ_2, 1024, 0);
        }
        flag++;	    	    // 超声波测距标志位加1
        if(flag == 3){		// 超声波测距标志位达到3，超声波测距结束，重新开始
            flag = 0;	// 超声波测距标志位复位
        }

        if(Hcsr04GetLength < 6 && photo_flag){	// 超声波测距距离小于6cm，拍照
            printf("01_send_image\n");	        // 发送拍照命令
            photo_flag = 0;		                // 照片标志位置0，防止连续拍照
            send_image(cfd1);		            // 发送拍照命令到Qt
            printf("02_send_image\n");      	// 发送拍照命令

        }

        if(Hcsr04GetLength > 10){	            // 超声波测距距离大于10cm，停止拍照
            photo_flag = 1;		                // 照片标志位置1，可以拍照
            // printf("photo_flag = 1\n");
        }
        sleep(5); // 加入延时，防止过快循环
    }					
    // 关闭连接
    close(fd);
    close(cfd);

    close(fd1);
    close(cfd1);

    pthread_join(recvdata, NULL);
    pthread_join(recvimage, NULL);

}

